package com.penghaisoft.microwms.common.service.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import com.penghaisoft.microwms.common.Constant;
import com.penghaisoft.microwms.common.service.IWmsCommonService;

@Slf4j
@Service("wmsCommonService")
public class WmsCommonServiceImpl implements IWmsCommonService{
	
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
	private static SimpleDateFormat sdfShort = new SimpleDateFormat("yyMMdd");
	
	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	/** 
	 * <p>Title: getSeqLen8</p> 
	 * <p>Description: </p> 
	 * @Title: getSeqLen8 
	 * @Description: 得到8位的流水号
	 * @author zhangxu 
	 * @2017年9月28日:2017年9月28日:下午1:24:40
	 * @param @param seqName
	 * @param @param size
	 * @param @return       
	 * @throws 
	 * @version V0.1 
	 * @see com.haier.cosmo.wms.service.common.IWmsCommonService#getSeqLen8(java.lang.String, int) 
	 */
	@Override
	public List<String> getSeqLen8(String seqName, int size) {
		List<String> seqList = new ArrayList<>();
		if (size > 0) {
			String datePrefix = sdf.format(new Date());
			String key = Constant.SEQ_PREFIX_REDIS + datePrefix + seqName;
			Long maxVal = stringRedisTemplate.boundValueOps(key).increment(size);
			for (int i = maxVal.intValue() - size + 1; i <= maxVal; i++) {
				String tmp = String.valueOf(i);
				while (tmp.length()<8) {
					tmp = "0" + tmp;
				}
				seqList.add(tmp);
			}
			removeLastKey(seqName);
		}
		return seqList;
	}
	
	/** 
	 * @Title getPsSeq
	 * @Description 生产以PS+yymmdd+8位序列号
	 * @author luoteng
	 * @date 2017年9月28日:下午2:58:17
	 * @param seqName
	 * @param size
	 * @return List<String>
	 */
	@Override
	public List<String> getPsSeq(String seqName,int size){
		List<String> rtnList = new ArrayList<>();
		List<String> seqList = new ArrayList<>();
		seqList = getSeqLen8(seqName, size);
		SimpleDateFormat fromat = new SimpleDateFormat("yyMMdd");
		for(String str : seqList){
			String tmp = "PS" + fromat.format(new Date()) + str;
			rtnList.add(tmp);
		}
		return rtnList;
	}
	
	/** 
	* @Title: removeLastKey 
	* @Description: 移除前几天的key
	* @author zhangxu 
	* @2017年9月28日:2017年9月28日:下午2:08:10
	* @param @param seqName    
	* @return void
	* @version V0.1    
	* @throws 
	*/
	private void removeLastKey(String seqName){
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		String datePrefix = "";
		String key = "";
		List<String> keys = new ArrayList<>();
//		fix 如果昨天没产生相关序列，则不会删除
		for (int i = 0; i < 5; i++) {
			cal.add(Calendar.DATE, -1);
			datePrefix = sdf.format(cal.getTime());
			key = Constant.SEQ_PREFIX_REDIS + datePrefix + seqName;
			keys.add(key);
		}
		stringRedisTemplate.delete(keys);
	}

	/** 
	 * @Description: 获取成品简化的流水号
	 * 前缀+YYMMDD+3位数
	 * @Title: getProShortSeq 
	 * @Description: 获取成品简化的流水号
	 * @author zhangxu 
	 * @2017年11月13日:2017年11月13日:上午9:41:41
	 * @param @param buzPrefix 业务前缀
	 * @param @param seqName
	 * @param @param size
	 * @param @return       
	 * @throws 
	 * @version V0.1 
	 * @see com.haier.cosmo.wms.service.common.IWmsCommonService#getProShortSeq(java.lang.String, int) 
	 */
	@Override
	public List<String> getProShortSeq(String buzPrefix,String factoryCode,String seqName, int size) {
		List<String> seqList = new ArrayList<>();
		if (size > 0) {
			String datePrefix = sdfShort.format(new Date());
			String key = Constant.SEQ_PREFIX_SHORT_REDIS;
//			如果分工厂，则增加key
			if (factoryCode!=null && !"".equals(factoryCode)) {
				key = Constant.SEQ_PREFIX_SHORT_REDIS + factoryCode;
			}
//			redis key
			String redisKey = key + datePrefix + seqName;
			
			Long maxVal = stringRedisTemplate.boundValueOps(redisKey).increment(size);
			for (int i = maxVal.intValue() - size + 1; i <= maxVal; i++) {
				String tmp = String.valueOf(i);
				while (tmp.length()<3) {
					tmp = "0" + tmp;
				}
				seqList.add(buzPrefix+datePrefix+tmp);
			}
			removeYesterdayKey(key,seqName);
		}
		return seqList;
	}

	/** 
	* @Title: removeYesterdayKey 
	* @Description: 移除昨天的序列--改为移除前5天的
	* @author zhangxu 
	* @2017年11月13日:2017年11月13日:上午9:51:33
	* @param @param seqProShortPrefix
	* @param @param seqName    
	* @return void
	* @version V0.1    
	* @throws 
	*/
	private void removeYesterdayKey(String seqProShortPrefix, String seqName) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		List<String> keys = new ArrayList<>();
//		fix 如果昨天没产生相关序列，则不会删除
		for (int i = 0; i < 5; i++) {
			cal.add(Calendar.DATE, -1);
			String datePrefix = sdfShort.format(cal.getTime());
			String key = seqProShortPrefix + datePrefix + seqName;
			keys.add(key);
		}
//		stringRedisTemplate.delete(key);
		stringRedisTemplate.delete(keys);
		
	}

	/** 
	 * <p>Title: getProShortSeq5</p> 
	 * <p>Description: </p> 
	 * @Title: getProShortSeq5 
	 * @Description: 5位调拨流水号
	 * @author zhangxu 
	 * @2017年11月15日:2017年11月15日:下午6:05:29
	 * @param @param buzPrefix
	 * @param @param seqName
	 * @param @param size
	 * @param @return       
	 * @throws 
	 * @version V0.1 
	 * @see com.haier.cosmo.wms.service.common.IWmsCommonService#getProShortSeq5(java.lang.String, java.lang.String, int) 
	 */
	@Override
	public List<String> getProShortSeq5(String buzPrefix, String seqName, int size) {
		List<String> seqList = new ArrayList<>();
		if (size > 0) {
			String datePrefix = sdfShort.format(new Date());
			String key = Constant.SEQ_PREFIX_SHORT_REDIS;
			
//			redis key
			String redisKey = key + datePrefix + seqName;
			
			Long maxVal = stringRedisTemplate.boundValueOps(redisKey).increment(size);
			for (int i = maxVal.intValue() - size + 1; i <= maxVal; i++) {
				String tmp = String.valueOf(i);
				while (tmp.length()<5) {
					tmp = "0" + tmp;
				}
				seqList.add(buzPrefix+datePrefix+tmp);
			}
			removeYesterdayKey(key,seqName);
		}
		return seqList;
	}
	
	/** 
	 * <p>Title: getProShortSeq5</p> 
	 * <p>Description: </p> 
	 * @Title: getProShortSeq5 
	 * @Description: 5位调拨流水号
	 * @author zhangxu 
	 * @2017年11月15日:2017年11月15日:下午6:05:29
	 * @param @param buzPrefix
	 * @param @param seqName
	 * @param @param size
	 * @param @return       
	 * @throws 
	 * @version V0.1 
	 * @see com.haier.cosmo.wms.service.common.IWmsCommonService#getProShortSeq5(java.lang.String, java.lang.String, int) 
	 */
	@Override
	public List<String> getProBarCodeShortSeq5(String buzPrefix, String seqName, int size) {
		List<String> seqList = new ArrayList<>();
		if (size > 0) {
			String datePrefix = sdf.format(new Date());
			String key = Constant.SEQ_PREFIX_SHORT_REDIS;
			
//			redis key
			String redisKey = key + datePrefix + seqName;
			
			Long maxVal = stringRedisTemplate.boundValueOps(redisKey).increment(size);
			for (int i = maxVal.intValue() - size + 1; i <= maxVal; i++) {
				String tmp = String.valueOf(i);
				while (tmp.length()<5) {
					tmp = "0" + tmp;
				}
				seqList.add(buzPrefix+datePrefix+tmp);
			}
			removeYesterdayKey(key,seqName);
		}
		return seqList;
	}
}
